package com.ruoyi.prod.util;

import com.ruoyi.prod.enums.*;

/**
 * 判断工具类
 *
 * @author BaiBan
 * @since 2023/2/17
 */
public class IsUtil {

    /**
     * 根据状态确实是否允许操作
     *
     * @param state 审核状态
     * @return true 不可以操作; false 可以操作
     */
    public static boolean okAction(AuditState state, SysAction action) {
        // 审核通过 不允许任何操作
        if (state == AuditState.APPROVE)
            return true;
        // 待提交 允许任何操作
        if (state == AuditState.TO_COMMIT)
            return false;
        // 待审核 可以 提交 保存 删除
        if (state == AuditState.TO_AUDIT)
            return "126".contains(action.getCode());
        return false;
    }

    /**
     * 根据事件获取状态
     *
     * @param action 事件
     * @return 状态
     */
    public static AuditState getAuditState(SysAction action) {
        switch (action) {
            case SAVE:
            case WITHDRAW:
                return AuditState.TO_COMMIT;
            case COMMIT:
                return AuditState.TO_AUDIT;
            case REJECT:
                return AuditState.REJECTED;
            case PASS:
                return AuditState.APPROVE;
            default:
                return null;
        }
    }

    /**
     * 根据 操作 得到日志类型
     */
    public static LogTypeEnum getLogType(SysAction action) {
        return getLogType(action, null);
    }

    /**
     * 根据 操作和模块 得到日志类型
     *
     * @param action 操作
     * @param module 模块
     * @return 日志类型
     */
    public static LogTypeEnum getLogType(SysAction action, LogModuleEnum module) {

        // 使用模块
        if (module == LogModuleEnum.USE_APPLY) {
            switch (action) {
                case PASS:
                    return LogTypeEnum.USE;
                case REVERT:
                    return LogTypeEnum.REVERT;
            }
        }

        // 通用模块
        switch (action) {
            case SAVE:
                return LogTypeEnum.SAVE;
            case COMMIT:
                return LogTypeEnum.COMMIT;
            case REJECT:
                return LogTypeEnum.REJECT;
            case WITHDRAW:
                return LogTypeEnum.WITHDRAW;
            case PASS:
                return LogTypeEnum.PASS;
            case DELETE:
                return LogTypeEnum.DELETE;
            default:
                return null;
        }
    }

    public static LogTypeEnum getLogType(AssetState oldState, AssetState newState) {

        // 归还
        if (oldState == AssetState.IN_USE && newState == AssetState.NOT_USED) {
            return LogTypeEnum.REVERT;
        }

        // 维修结束 好
        if (oldState == AssetState.UNDER_REPAIR && newState == AssetState.NOT_USED) {
            return LogTypeEnum.REVERT;
        }

        // 报废
        if (newState == AssetState.SCRAP) {
            return LogTypeEnum.SCRAP;
        }

        return null;
    }
}
